'''
+= *= 是否产生新对象，取决于序列是否实现了__iadd__ __imul__
如果实现了 a.extend(b) 不会产生新对象
如果没实现，会调用__add__，a=a+b，会产生新对象
'''
import dis

l = [1, 2, 3]
print(id(l))
l *= 2
print(id(l), l)

# 不可变元组复制很耗时，因为要创建新对象，还要把老对象的值移动过去，而str不会，因为CPython做了优化，预留了空间
t = (1, 2, 3)
print(id(t))
t *= 2
print(id(t), t)

# 这个地方会报错，但还是会改变列表，因为操作不是原子的
# 不要将可变序列放到元组里面去
t = (1, 2, [30, 40])
t[2] += [50, 60]
print(t)

dis.dis('s[a]+=b')

if __name__ == '__main__':
    print('done')
